package com.zhang.hadoop.netty.nio.buffer;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

/**
 * @author: zhang yufei
 * @create: 2022-01-09 17:53
 * @description: MappedByteBuffer可以让文件直接在内（堆外内存）存修改，操作系统不需要拷贝一次
 **/
public class MappedByteBufferTest {

    public static void main(String argsp[]) {
        try {
            RandomAccessFile randomAccessFile = new RandomAccessFile("3.txt", "rw");
            FileChannel channel = randomAccessFile.getChannel();
            /**
             * 参数1：FileChannel.MapMode.READ_WRITE 使用的是读写模式
             * 参数2：0 可以直接修改的起始位置
             * 参数3：5 映射到内存的大小(不是索引位置)，即 1.txt 的多少个字节映射到内存，
             * 可以直接修改的范围就是0-4的索引
             * 实际类型是DirectByteBuffer
             */
            MappedByteBuffer mappedByteBuffer = channel.map(FileChannel.MapMode.READ_WRITE, 0, 5);
            mappedByteBuffer.put(0, (byte) 'H');
            mappedByteBuffer.put(3, (byte) '9');
            randomAccessFile.close();
            System.out.println("修改成功");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
